#!/bin/bash
# Script automatisant la connexion aux réseaux connus
# MerMouY Gnu
# Version:0.1.1
# Ce script requiert un fichier passé en argument ou lira le fichier $HOME/.config/wepass
# Vous trouverez un exemple de fichier de sources rédigé dans $HOME/.config/wepass
# Vous pouvez également lancer la commande wepass -c pour le créer interactivement ou encore lancer wepass -g pur en générer un vierge prêt à remplir

###VARIABLES À ÉDITER AU BESOIN
#Interface réseau à configurer
Eth="wlan0"

#Commande wireless
Iw="iwconfig"

#Commande réseau
If="ifconfig"

###VARIABLES
#Fichier contenant les réseaux (passé en argument au script)
Fap="$1"
Fap1=".tempfap"
Wepfile="/etc/wepass"
Weptemp="/temp/.tempwep"

###FIN DES VARIABLES

#Vérification superutilisateur
if [[ $EUID -ne 0 ]]; then
	zenity --error --text="<b>Vous avez besoin des droits administrateurs pour gérer les cartes wifi\!</b>" --title="Wepass" --timeout=3
	exit 0
fi

#Vérification emplacement du script
path="/usr/local/sbin"
pathactu=$(dirname $0)
if [ "$pathactu" != "$path" ]
then zenity --question --text="Le script n'était pas dans <b>$path</b>\nVoulez vous le déplacer automatiquement et le lancer à nouveau?\n\nVous devrez par la suite lancer ce script depuis son nouveau chemin:\n\n$path/$0" --title="Wepass"
	if [ "$?" = "1" ] ; then exit
	else mv -b $0 $path/wepass && chmod +x $path/wepass && exec wepass
	fi
fi

# Création d'un fichier de sources vide
Createwepassvide () {
if [ -f $Wepfile ] 
then Ecrase=$(zenity --question --text="<span color=\"red\">Le fichier existe\!</span>\nContinuer quand même et l'écraser?")
fi
echo -e "#!/bin/bash\n#Ce fichier à été généré automatiquement par Wepass\n#Pour l'éditer correctement chaque entrée doit être séparée par une tabulation\n#\n#Voici un exemple d entrée (retirez le # en début de ligne)\n#Point d'accès\t|\tNom du réseau\t|\tClé\t|\tAuto ou Adresse\t|\tCanal\t|\tPasserelle\t|\tDns1\t|\tDns2\n
#00:00:00:00:00:11\tNextdoorWifi\thfqhfdsmhgqshgmkqhsgkmh\t192.168.0.2\t11\t192.168.0.1\t8.8.8.8\t4.4.4.4\n\n#auto\tNextdoorWifi\thfqhfdsmhgqshgmkqhsgkmh\tauto\t11\t192.168.0.1\t8.8.8.8\t4.4.4.4\n\n#Acces Point\t|\tName\t|\tKey\t|\tAddress or auto\t|\tChannel\t|\tGatheway\t|	Dns1\t|\tDns2\n" > $Wepfile || zenity --error --text="Création du fichier impossible\!"
zenity --info --text="<b>Création du fichier réussie\!</b>\n\nLe fichier se trouve à: $Wepfile\n\nVous allez maintenant pouvoir l'éditer, le script continuera dès que vous aurez fermé l'éditeur de texte." --width=300 
}

###FONCTIONS

#Vérifie les adresses entrées
IsIPv4 () {
if [ $# = 1 ]
then 
 printf $1 | grep -Eq '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)$'
 echo $?
else
 echo bad
fi
}

#Test de la connexion
Verif () {
ping -q -c 2 google.com >/dev/null 2>&1 
if [ $? -eq 0 ]; then 
	zenity --info --text="Vous êtes connecté."
	exit 0
else 
	zenity --question --text="Vous n'êtes pas connecté.\n\nRelancer l'assistant?" || exit 0
	if [ $? = 0 ]
		then exec wepass $1
	fi
fi
}

#Applique la configuration
function Applyconf () {
dns1="$7"
dns2="$8"
$Iw $Eth essid $3 key $4 ap $2 mode managed channel $6
if [ "$4" = "auto" ] || [ "$4" = "dhcp" ] || [ -z "$4" ]
	then dhclient $Eth &> .dhc | zenity --progress --auto-kill --pulsate --auto-close --text="Configuration automatique de $Eth" # Avec dhcp
	zenity --text-info --width=400 --filename=.dhc && rm .dhc
	Verif
# Validité des entrées adresse
elif [ ! -z $(echo $# | grep "bad") ]
	then zenity --error --text="Une de vos adresse est incorrecte\!\n\nModifiez votre fichier de sources..."
	exit 0
# Application des adresses entrées
else 
# Variables réseau
Adrbase=$(echo "$4" | sed 's/\(.*\)./\1/')
# Network
Net=$(echo "$Adrbase" | sed 's/\./\.0/')
# Broadcast
Broad=$(echo "$Adrbase" | sed 's/\./\.255/')
# Ifconfig
	$If $Eth inet $4 network $Net netmask 255.255.255.0 broadcast $Broad
# Passerelle
	route add default gw $6 || zenity --error
# Resolf.conf
	if [ -z "$dns2" ] && [ -z "$dns1" ] && [ -z "$6" ] # Si non fournis, utiliser google
		then echo -e "# Generated by Wepass\nnameserver 8.8.8.8\nnameserver 4.4.4.4" > /etc/resolv.conf
	elif [ -z "$dns2" ] && [ -z "$dns1" ] && [ ! -z "$6" ] # Si passerelle fournie, utiliser passerelle
		then echo -e "# Generated by Wepass\nnameserver $7" > /etc/resolv.conf
	elif [ -z "$dns2" ] && [ ! -z "$dns1" ] # Si un seul fournis ajout de la passerelle
		then echo -e "# Generated by Wepass\nnameserver $dns1\nnameserver $7" > /etc/resolv.conf
	else echo -e "# Generated by Wepass\nnameserver $dns1\nnameserver $dns2" > /etc/resolv.conf # Sinon écrire ceux fournis
# Vérification connexion
	Verif
	fi
fi
}


###SCRIPT

#Vérification fichier
if [ -z "$1" ] && [ ! -f $Wepfile ]
	then Quefaire=$(zenity --title="Wepass" --list --text="Il semble que vous n'ayez fourni aucun fichier de réseaux source.\nEt que le fichier référence <b>/etc/wepass</b> n'existe pas.\n\nVoulez-vous:" --column="Action" --hide-header "Créer un fichier vierge" "Éditer le fichier existant" "Sélectionner un fichier de sources") || exit 0
	if [ "$Quefaire" = "Créer un fichier vierge" ]
		then Createwepassvide && gedit $Wepfile && exec wepass $Wepfile
	elif [ "$Quefaire" = "Éditer le fichier existant" ]
		then gedit $Wepfile && exec wepass
	elif [ "$Quefaire" = "Sélectionner un fichier de sources" ]
		then Wepfilesel=$(zenity --file-selection --title="Choississez un fichiers de sources de réseaux Wep")
		exec wepass $Wepfilesel
	fi
elif [ -z "$1" ] && [ -f $Wepfile ]
	then Quefaire=$(zenity --title="Wepass" --list --text="Il semble que vous n'ayez fourni aucun fichier de réseaux source.\n\nCependant le fichier référence <b>/etc/wepass</b> existe. Voulez-vous:" --column="Action" --hide-header "Éditer le fichier existant" "Sélectionner un autre fichier de sources") || exit 0
	if [ "$Quefaire" = "Éditer le fichier existant" ]
		then gedit $Wepfile && exec wepass $Wepfile
	elif [ "$Quefaire" = "Sélectionner un autre fichier de sources" ]
		then Wepfilesel=$(zenity --file-selection --title="Choississez un fichiers de sources de réseaux Wep")
		exec wepass $Wepfilesel
	fi
elif [ "$1" = "-c" ]
	then Createwepassvide
elif [ "$1" = "-e" ]
	then gedit $Wepfile
fi

##Extraction des données
#Nettoyage fichier et numérotation des lignes
while [ -z "$(cat $Fap | grep -v "#" | grep -v "^$")" ]
do zenity --error --text="Aucun  réseau valable trouvé dans ce fichier\!\Lancement de l'éditeur, relance du script à la fermeture de gedit."
gedit $Fap
done
if [ ! -f $Fap ]
then zenity --error --text="Le fichier n'existe pas" && exit 0
fi
sed '/^[ ]*#/d' $Fap | sed '/^$/d' | sed = | sed '/./N;s/\n/ /' > $Fap1

#Extraction des Nom du réseaus de réseaux
Listap="$(awk -F ' ' '{print $1 " " $3}' $Fap1 | xargs)"

#Choix du réseau
N=$(zenity --title="Wepass" \
--text="Choisissez le réseau auquel vous connecter:" \
--list \
--hide-column 1 \
--column "#" \
--column "Essid" \
$Listap) || exit 0

#Confirmation avant configuration du réseau
Conf=$(cat $Fap1 | grep -E ^$N | sed -e "s/$N//")
zenity --question --text="Est-ce que vous voulez appliquer les paramêtres suivants?\n\n$Conf"
case $? in 
	1) rm $Fap1 && exec wepass ;;
	0) Applyconf $Conf && rm Fap1;;
esac
rm $Fap1
exit 0

